package com.easy.order.controller;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alipay.api.AlipayApiException;
import com.easy.common.bean.ConcertBean;
import com.easy.common.bean.ConresultBean;
import com.easy.common.bean.OrderBean;
import com.easy.common.bean.SeatPriceBean;
import com.easy.common.service.IConcertService;
import com.easy.common.service.IOrderService;
import com.easy.common.service.ISeatPriceService;
import com.easy.common.util.PayUtil;
import com.easy.common.util.SYS;
import com.easy.common.util.TokenUtil;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.UUID;

@Controller
@RequestMapping("/alipay")
@CrossOrigin
public class APayController {
    @Autowired
    private IOrderService orderService;
    @DubboReference
    private ISeatPriceService seatPriceService;

    @DubboReference
    private IConcertService concertService;

    // 用于临时存储订单结果信息
    private ConresultBean conresultBean = null;
  // 用于临时存储令牌
    private String tokens = "";
            /**
      * 发起支付宝支付请求
      */
//           @ResponseBody
//    @PostMapping("/pay")
//    public String alipay(@RequestHeader String token, @RequestBody ConresultBean conresultBean) throws AlipayApiException {
//                // 存储当前请求的订单信息和令牌
//                        this.conresultBean = conresultBean;
//              this.tokens = token;
//
//                        // 生成唯一订单号（支付宝要求订单号唯一）
//                                String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
//                String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
//                String orderNum = time + uuid;
//
//                        // 获取订单信息
//                                OrderBean order = orderService.getOrderById(conresultBean.getId());
//                if (order == null) {
//                        throw new IllegalArgumentException("订单不存在，订单ID: " + conresultBean.getId());
//                    }
//
//                       // 获取座位价格信息
//                                SeatPriceBean seatPrice = seatPriceService.getSeatPriceById(order.getSeatpriceid());
//                if (seatPrice == null) {
//                        throw new IllegalArgumentException("座位价格信息不存在，座位价格ID: " + order.getSeatpriceid());
//                   }
//
//                        // 获取订单金额（从座位价格表中获取价格）
//                                float orderValue = seatPrice.getPrice().floatValue();
//
//                        // 获取演唱会信息
//                                ConcertBean concert = concertService.getConcertById(seatPrice.getConcertid());
//                if (concert == null) {
//                        throw new IllegalArgumentException("演唱会信息不存在，演唱会ID: " + seatPrice.getConcertid());
//                    }
//
//                        // 获取商品名称（从演唱会表中获取标题）
//                                String productName = concert.getTitle();
//                System.out.println("商品名字: " + productName);
//
//                        // 调用支付工具类，向支付宝发送支付请求
//                                return PayUtil.sendRequestToAlipay(orderNum, orderValue, productName);
//            }

            @ResponseBody
            @PostMapping("/pay")
            public String alipay(@RequestHeader String token, @RequestParam Integer seatId) throws AlipayApiException {
                // 1. 根据 seatId 查询 seatprice 表
                SeatPriceBean seatPrice = seatPriceService.getSeatPriceBySeatId(seatId);
                if (seatPrice == null) {
                    throw new IllegalArgumentException("座位价格信息不存在，座位ID: " + seatId);
                }

                // 2. 查询关联的演唱会信息（用于商品名称）
                ConcertBean concert = concertService.getConcertById(seatPrice.getConcertid());
                if (concert == null) {
                    throw new IllegalArgumentException("演唱会信息不存在，演唱会ID: " + seatPrice.getConcertid());
                }

                // 3. 生成唯一订单号
                String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
                String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
                String orderNum = time + uuid;

                // 4. 调用支付工具类，发起支付请求
                float orderValue = seatPrice.getPrice().floatValue();
                String productName = concert.getTitle();
                return PayUtil.sendRequestToAlipay(orderNum, orderValue, productName);
            }
            /**
      * 支付完成后支付宝回调处理
      */
                @GetMapping("/toSuccess")
                public String returns(String out_trade_no, HttpServletRequest request) throws AlipayApiException {
                // 查询订单支付状态
                String queryResult = PayUtil.query(out_trade_no);
                System.out.println("支付宝查询结果: " + queryResult);

                // 解析支付宝返回的JSON数据
                JSONObject jsonObject = JSONUtil.parseObj(queryResult);
                Map<String, Object> resultMap = jsonObject.get("alipay_trade_query_response", Map.class);
                System.out.println("支付结果详情: " + resultMap);

                // 验证支付状态
                String tradeStatus = (String) resultMap.get("trade_status");
                if ("TRADE_SUCCESS".equals(tradeStatus)) {
                    // 支付成功，执行后续操作
                    System.out.println("订单支付成功，订单号: " + out_trade_no);

                    // 从令牌中获取用户ID
                    Integer userId = Integer.parseInt(TokenUtil.getToken(SYS.TOKEN_USER_ID,tokens));
                    if (userId == null) {
                        throw new SecurityException("无法解析用户令牌");
                    }

                    // 更新订单信息
                    if (conresultBean != null) {
                        conresultBean.setUserid(userId);
                        // 注意：这里应该使用当前订单对象
                        OrderBean currentOrder = orderService.getOrderById(conresultBean.getId());
                        int updateResult = orderService.uploadOrder(currentOrder);
                        System.out.println("订单更新结果: " + (updateResult > 0 ? "成功" : "失败"));
                    }

                    // 跳转到前端支付成功页面
                    return "redirect:http://localhost:8082/#/paysuccess";
                    } else {
                       // 支付失败处理
                              System.out.println("订单支付失败，状态: " + tradeStatus);
                        return "redirect:http://localhost:8082/#/payfail"; // 建议跳转到专门的失败页面
                    }
            }
}